package com.operation;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.htmlparser.Parser;
import org.htmlparser.filters.AndFilter;
import org.htmlparser.filters.NodeClassFilter;
import org.htmlparser.filters.NotFilter;
import org.htmlparser.filters.TagNameFilter;
import org.htmlparser.tags.ScriptTag;
import org.htmlparser.util.NodeList;
import org.mk.type.MySQLTypeFactory;
import org.mk.type.Type;
import com.db.ColumnInfoBean;
import com.db.ForeignKey;
import com.db.connection.DBCPPostgresManager;
import com.excel.read.Config;
import com.excel.read.DBTable;
import com.xml.Record;
import com.xml.RecordExtract;

/**
 * 记录同步
 * 
 * @author mike
 * 
 */
public class CopyOfRecordOperation {

//	public static List<OperationMap> getValue() {
//		OperationMap opMap = new OperationMap();
//		
//		Map<String,List<Record>> map = null;
//		RecordExtract capterSpider2 = new RecordExtract();
//		List<OperationMap> list = null;
//		try {
//			
//			Parser parser = new Parser("d:\\firm.html");
//			parser.setEncoding("gb2312");
//			// 迭代所有节点, null 表示不使用 NodeFilter
//			TagNameFilter tf = new TagNameFilter("body");
//			NotFilter ntFilter = new NotFilter(new NodeClassFilter(ScriptTag.class));
//			AndFilter rorFilter = new AndFilter(tf, ntFilter);
//			NodeList alist = parser.parse(tf);
//			String content = alist.toHtml();
//			list =  capterSpider2.extractKeyWordText(content);
//		} catch (Exception e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		return list;
//	}
//
//	public static void insert() {
//		List<OperationMap> list = getValue();
//		for(OperationMap opMap: list) {
//			Map<String,List<Record>> aMap = opMap.aMap;
//			insert(opMap, opMap.record);
//		}
//		
//	}
//	
//	public static void insert(List<OperationMap> list) {
//		for(OperationMap opMap: list) {
//			Map<String,List<Record>> aMap = opMap.aMap;
//			if(opMap.record.op.equalsIgnoreCase("insert")) {
//				insert(opMap, opMap.record);
//			}else if(opMap.record.op.equalsIgnoreCase("update")){
//				update(opMap, opMap.record);
//			}
//			
//		}
//		
//	}
//	
//	
//
//	/**
//	 * 取得下一个主键值
//	 * @param dbTable
//	 * @return
//	 */
//	public static long getNextPK(DBTable dbTable) {
//		ColumnInfoBean pk = dbTable.getPk();
//		Connection conn = null;
//		PreparedStatement pstmt = null;
//		ResultSet rs = null;
//		ResultSet res = null;
//		try {
//			
//			conn = DBCPPostgresManager.getConnection();
//			// 执行SQL语句
//			pstmt = conn.prepareStatement("select max(" + pk.getName()
//					+ ") from " + dbTable.getName());
//
//			rs = pstmt.executeQuery();
//			if (rs.next()) {
//				return rs.getLong(1);
//			}
//		} catch (Exception ex) {
//			System.out.println("Error : " + ex.toString());
//		}finally {
//			try {
//				rs.close();
//				pstmt.close();
//			} catch (SQLException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			
//		}
//		return 0;
//	}
//
//	
//	/**
//	 * 根据业务主键取得自然主键
//	 * @param aForeignKey
//	 * @return
//	 */
//	public static String getQueryID(ForeignKey aForeignKey) {
//		StringBuffer sbf = new StringBuffer();
//		sbf.append("select ");
//		sbf.append(aForeignKey.getToTable().getPk().getName());
//		sbf.append(" from ");
//		sbf.append(aForeignKey.getToTable().getName());
//		sbf.append(" where ");
//		List<ColumnInfoBean> realPKs = aForeignKey.getToTable().realPK;
//		boolean flag = true;
//		for(ColumnInfoBean rpk : realPKs) {
//			if(flag) {
//				flag = !flag;
//				sbf.append(rpk.getName());
//				sbf.append(" = ? ");
//			}else {
//				sbf.append(" and ");
//				sbf.append(rpk.getName());
//				sbf.append(" = ?");
//			}
//		}
//		
//		
//		return sbf.toString();
//	}
//	
////	public static String getQueryID2(ForeignKey aForeignKey) {
////		StringBuffer sbf = new StringBuffer();
////		sbf.append("select pk_client ");
////		sbf.append(" from rfpk");
////		sbf.append(" where ");
////		List<ColumnInfoBean> realPKs = aForeignKey.getToTable().realPK;
////		boolean flag = true;
////		for(ColumnInfoBean rpk : realPKs) {
////			if(flag) {
////				flag = !flag;
////				sbf.append(rpk.getName());
////				sbf.append(" = ? ");
////			}else {
////				sbf.append(" and ");
////				sbf.append(rpk.getName());
////				sbf.append(" = ?");
////			}
////		}
////		
////		
////		return sbf.toString();
////	}
//	
//	/**
//	 * 取得自然主键和业务逐渐值对
//	 * @param aForeignKey
//	 * @return
//	 */
//	public static String getQueryIDValue(ForeignKey aForeignKey) {
//		StringBuffer sbf = new StringBuffer();
//		sbf.append("select ");
//		String pkName = aForeignKey.getToTable().getPk().getName();
//		sbf.append(pkName);
//		for(ColumnInfoBean cinfo : aForeignKey.getToTable().realPK) {
//			if(!pkName.equalsIgnoreCase(cinfo.getName())) {
//				sbf.append(", ");
//				sbf.append(cinfo.getName());
//			}
//		}
//		
//		sbf.append(" from ");
//		sbf.append(aForeignKey.getToTable().getName());
//		sbf.append(" where ");
//		boolean flag = true;
////		for(ColumnInfoBean cinfo : aForeignKey.getToTable().realPK) {
////			if(flag) {
////				flag = !flag;
////				sbf.append(cinfo.getName());
////				sbf.append(" = ?");
////			}else {
////				sbf.append(" and ");
////				sbf.append(cinfo.getName());
////				sbf.append(" = ?");
////			}
////			
////		}
//		
//		sbf.append(aForeignKey.getToTable().getPk().getName());
//		sbf.append(" = ? ");
//		return sbf.toString();
//	}
//	
//	/**
//	 * 插入一条记录
//	 * 1.首先判断字段是否是主键
//	 * 2.判断字段是否是外键
//	 * 
//	 * @param dbTable
//	 * @param opMap
//	 * @param request
//	 */
//	public static void insert(OperationMap opMap, Record record) {
//		DBTable dbTable = (DBTable) Config.allTable.get(record.getTableName());
//		Map request = opMap.record.fieldMap;
//		List<ColumnInfoBean> cinfoNameList = dbTable.getColumnInfos();
//		List<String> selfNameList = new ArrayList<String>();
//		for (ColumnInfoBean cinfo : cinfoNameList) {
//			selfNameList.add(cinfo.getName());
//		}
//		String sql = dbTable.getInsertSQL();
//
//		ColumnInfoBean pk = dbTable.getPk();
//
//		try {
//			Connection conn = DBCPPostgresManager.getConnection();
//			// 执行SQL语句
//			PreparedStatement pstmt = conn.prepareStatement(sql);
//			for (int i = 0; i < cinfoNameList.size(); i++) {
//				ColumnInfoBean cib = cinfoNameList.get(i);
//
//				Type type = MySQLTypeFactory
//						.basic(cib.getNoPresitionTypeName());
//				String fieldName = selfNameList.get(i).toLowerCase();
//				if(fieldName.equalsIgnoreCase("dateacct")) {
//					int x = 9;
//					x++;
//				}
//				//判断是否外键
//				Object value = null;
//				if(dbTable.isFK(fieldName)) {
//					//父表名，记录ID
//					ForeignKey aForeignKey = dbTable.getFK(fieldName.toUpperCase());
//					String qSql = getQueryID(aForeignKey);
//					//自然主键
//					value = type.getValue((String) request.get(fieldName.toUpperCase()));
//					//根据自然主键取得业务主键（多字段）
//					Map map = opMap.getPKByRPK(aForeignKey.getToTableName(), value.toString());
//					//根据业务主键取得自然主键
//					//父表
//					DBTable pTable = (DBTable) Config.allTable.get(aForeignKey.getToTableName());						
//					
//					//业务主键
//					List<ColumnInfoBean> acibs = pTable.realPK;
//					List<Type> types = new ArrayList<Type>();
//					List<Object> values = new ArrayList<Object>();
//					for(int j=0; j<acibs.size(); j++) {
//						ColumnInfoBean acib = acibs.get(j);
//						Type atype = MySQLTypeFactory.basic(acib.getNoPresitionTypeName());
//						types.add(atype);
//						Object fieldValue = map.get(acib.getName());
//						values.add(fieldValue);
//					}
//					//新主键值
//					Object pkv = getPKByRPK(qSql, types, values);
//					Record rd = opMap.getRecord(aForeignKey.getToTableName(), value.toString());
//					//跟新标志
//					rd.setFlag();
////					//如果是外键，设置新值
//					record.fieldMap.put(fieldName, pkv.toString());
//					
//				}
//				
//				
//				
//				//主键
//				if (cib == pk) {
//					value =  getNextPK(dbTable)+1;
//				} else {
//					
//					Object fieldValue = request.get(fieldName.toUpperCase());
//					
//					value = type.getValue((String) fieldValue);
//				}				
//				type.nullSafeSet(pstmt, value, i + 1);
//				System.out.println(cib.getName());
//			}
//			int a;
//			pstmt.executeUpdate();
//			
//			pstmt.getConnection().commit();
//		} catch (Exception ex) {
//			System.out.println("Error : " + ex.toString());
//		}
//	}
//	
//	
//	/**
//	 * 
//	 * @param opMap
//	 * @param record 含有待修改的列
//	 */
//	public static void update(OperationMap opMap, Record record) {
//		DBTable dbTable = (DBTable) Config.allTable.get(record.getTableName());
//		Map request = opMap.record.fieldMap;
//		List<ColumnInfoBean> cinfoNoPKNameList = record.getNoPKColumnInfos();
//		
//		List<ColumnInfoBean> cinfoPKNameList = record.getPKColumnInfos();
//		
//		
//		List<String> selfNameList = new ArrayList<String>();
//		for (ColumnInfoBean cinfo : cinfoNoPKNameList) {
//			selfNameList.add(cinfo.getName());
//		}
//		String sql = record.getUpdateSQL();
//
//		ColumnInfoBean pk = dbTable.getPk();
//
//		try {
//			Connection conn = DBCPPostgresManager.getConnection();
//			// 执行SQL语句
//			PreparedStatement pstmt = conn.prepareStatement(sql);
//			// 执行SQL语句
//			pstmt = conn.prepareStatement(sql);
//			for (int i = 0; i < cinfoNoPKNameList.size(); i++) {
//				ColumnInfoBean cib = cinfoNoPKNameList.get(i);
//
//				Type type = MySQLTypeFactory
//						.basic(cib.getNoPresitionTypeName());
//				String fieldName = selfNameList.get(i).toLowerCase();
//				if(fieldName.equalsIgnoreCase("dateacct")) {
//					int x = 9;
//					x++;
//				}
//				//判断是否外键
//				Object value = null;
//				if(dbTable.isFK(fieldName)) {
//					//父表名，记录ID
//					ForeignKey aForeignKey = dbTable.getFK(fieldName.toUpperCase());
//					String qSql = getQueryID(aForeignKey);
//					//自然主键
//					value = type.getValue((String) request.get(fieldName.toUpperCase()));
//					//根据自然主键取得业务主键（多字段）
//					Map map = opMap.getPKByRPK(aForeignKey.getToTableName(), value.toString());
//					//根据业务主键取得自然主键
//					//父表
//					DBTable pTable = (DBTable) Config.allTable.get(aForeignKey.getToTableName());						
//					
//					//业务主键
//					List<ColumnInfoBean> acibs = pTable.realPK;
//					List<Type> types = new ArrayList<Type>();
//					List<Object> values = new ArrayList<Object>();
//					for(int j=0; j<acibs.size(); j++) {
//						ColumnInfoBean acib = acibs.get(j);
//						Type atype = MySQLTypeFactory.basic(acib.getNoPresitionTypeName());
//						types.add(atype);
//						Object fieldValue = map.get(acib.getName());
//						values.add(fieldValue);
//					}
//					
//					
//					
////					Object pkv = getPKByRPK2(orgId, );//getPKByRPK(qSql, types, values);
//					Record rd = opMap.getRecord(aForeignKey.getToTableName(), value.toString());
//					
//					//orgId
//					Long orgId = (Long) rd.fieldMap.get("AD_ORG_ID");
//					Long apk = (Long) rd.fieldMap.get((rd.getTableName()+"_ID").toLowerCase());
//					Object pkv = getPKByRPK2(orgId, rd.getTableName(), apk);//getPKByRPK(qSql, types, values);
//					//跟新标志
//					rd.setFlag();
////					//如果是外键，设置新值
//					record.fieldMap.put(fieldName, pkv.toString());
//					
//				}
//				Object fieldValue = request.get(fieldName.toUpperCase());
//				value = type.getValue((String) fieldValue);				
//				type.nullSafeSet(pstmt, value, i + 1);
//				
//			}
//			
//			//主键
//			for (int i = 0; i < cinfoPKNameList.size(); i++) {
//				ColumnInfoBean cib = cinfoPKNameList.get(i);
//				//取得主键关联
//				Long orgId = (Long) record.fieldMap.get("AD_ORG_ID");
//				Long apk = (Long) record.fieldMap.get((record.getTableName()+"_ID").toLowerCase());
//				Long pkv = getPKByRPK2(orgId, record.getTableName(), apk);
//				
//				record.fieldMap.put(cib.getName(), pkv.toString());
//			}
//			
//			int a;
//			pstmt.executeUpdate();			
//			pstmt.getConnection().commit();
//		} catch (Exception ex) {
//			System.out.println("Error : " + ex.toString());
//		}
//	}
//
//	
//	/**
//	 * 根据本地业务主键取得本地自然主键（用于同步服务）
//	 * @return
//	 */
//	public static long getPKByRPK(String sql, List<Type> types, List<Object> values) {
//		Connection conn = null;
//		PreparedStatement pstmt = null;
//		ResultSet rs = null;
//		ResultSet res = null;
//		try {
//			
//			conn = DBCPPostgresManager.getConnection();
//			// 执行SQL语句
//			pstmt = conn.prepareStatement(sql);
//			for(int i=0; i<types.size(); i++) {
//				Type type =  types.get(i);
//				type.nullSafeSet(pstmt, values.get(i), i+1);	
//			}					
//			rs = pstmt.executeQuery();			
//			if (rs.next()) {
//				return rs.getLong(1);
//			}
//		} catch (Exception ex) {
//			System.out.println("Error : " + ex.toString());
//		}finally {
//			DBCPPostgresManager.close(conn, pstmt, rs);
//			
//		}
//		return 0;
//	}
//	
//	/**
//	 * 根据refpk表取得新主键，用于外键查询
//	 * @param sql
//	 * @param types
//	 * @param values
//	 * @return
//	 * select pk_client from refpk where org_id= ? and table_name = ? and pk = ? 
//	 */
//	public static long getPKByRPK2(long orgId , String tableName, long pk) {
//		String sql = "select pk_client from refpk where org_id= ? and table_name = ? and pk = ?";
//		Connection conn = null;
//		PreparedStatement pstmt = null;
//		ResultSet rs = null;
//		ResultSet res = null;
//		try {
//			
//			conn = DBCPPostgresManager.getConnection();
//			// 执行SQL语句
//			pstmt = conn.prepareStatement(sql);
//			pstmt.setLong(1, orgId);
//			pstmt.setString(2, tableName);
//			pstmt.setLong(3, pk);
//							
//			rs = pstmt.executeQuery();			
//			if (rs.next()) {
//				return rs.getLong(1);
//			}
//		} catch (Exception ex) {
//			System.out.println("Error : " + ex.toString());
//		}finally {
//			DBCPPostgresManager.close(conn, pstmt, rs);
//			
//		}
//		return 0;
//	}
//	
//	/**
//	 * 根据本地自然主键取得自然主键，和业务主键值对
//	 * @return
//	 */
//	public static  List<Record> getPKValue(String tableName, List<String> fields, String sql, Type type, Object value) {
//		 List<Record>  aList = new ArrayList<Record>(); 
//		Connection conn = null;
//		PreparedStatement pstmt = null;
//		ResultSet rs = null;
//		ResultSet res = null;
//		try {
//			
//			conn = DBCPPostgresManager.getConnection();
//			// 执行SQL语句
//			pstmt = conn.prepareStatement(sql);
//			type.nullSafeSet(pstmt, value, 1);			
//			rs = pstmt.executeQuery();			
//			if (rs.next()) {
//				Record aRecord = new Record();
//				aRecord.setTableName(tableName);
//				for(String fieldName : fields) {
//					Object aValue = type.nullSafeGet(rs, fieldName, null);
//					aRecord.put(fieldName, aValue);
//				}
//				aList.add(aRecord);
//				return aList;
//			}
//		} catch (Exception ex) {
//			System.out.println("Error : " + ex.toString());
//		}finally {
//			try {
//				rs.close();
//				pstmt.close();
//			} catch (SQLException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//			
//		}
//		return aList;
//	}
//	
//
//	/**
//	 * 新增记录
//	 * 
//	 * @return
//	 */
//	public boolean add(DBTable table, Map record) {
//
//		// 1取得各个字段
//
//		// 新增数据
//		return false;
//
//	}

}
